unit UHilo;

interface

uses
  Classes, SysUtils, Math;

type
  Vect= array [0..31] of double;
  Hilo = class(TThread)
  private
    { Private declarations }
    PuertoFisico, PuertoAbs: integer;
  protected
    procedure Execute; override;
  public
     senalT, senalL: Vect;
     adr: integer;
     dat: integer;
     constructor Create(const prioridad, pFisico, pAbs: integer);
     procedure paintTemperaturaH();
     procedure paintLuzH();
     procedure imprimirDatos();
  end;

implementation
uses
Uclient;

constructor Hilo.Create(const prioridad, pFisico, pAbs: integer);
var
   i: integer;
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  PuertoFisico:= pFisico;
  PuertoAbs:= pAbs;
  adr:= 0;
  dat:= 0;
   for i:= 0 to Length(senalT)-1 do
   begin
      senalT[i]:= 0;
      senalL[i]:= 0;
   end;
   Priority:= TThreadPriority(prioridad);
end;

FUNCTION PortIn(IOport: WORD): BYTE; ASSEMBLER; REGISTER;
ASM
  MOV DX,AX
  IN AL,DX
END;

PROCEDURE PortOut(IOport: WORD; Value: BYTE ); ASSEMBLER; REGISTER;
ASM
  XCHG DX,AX
  OUT DX,AL
END;


procedure Hilo.Execute;
begin
   while true do
   begin
      while FCliente.IdTCPClient1.Connected do
      begin
         dat:= StrToInt(FCliente.IdTCPClient1.ReadLn);
         if (dat = 254)or(dat = 255) then
         begin
           PortOut(PuertoFisico, dat);
           adr:= dat;
         end
         else
         begin
            if adr <> 0 then
            begin
               case adr of
                  254: begin
                          PortOut(PuertoFisico, round(dat/2.56565656));  //Pongo temperatura
                          Synchronize(paintTemperaturaH);
                       end;
                  255: begin
                          PortOut(PuertoFisico, dat);
                          Synchronize(paintLuzH);
                       end;
               end;
            end;
         end;
      end;
      dat:= 0;
      Synchronize(paintTemperaturaH);
      Synchronize(paintLuzH);
   end;
end;

procedure Hilo.paintTemperaturaH();
var
   i: integer;
begin
   FCliente.Series1.Clear;
   for i:= Length(senalT)-1 downto 1 do
      senalT[i]:= senalT[i-1];
   senalT[0]:= dat/2.56565656;
   FCliente.Series1.AddArray(senalT);
   FCliente.EIstantaneoT.Text:= FloatToStr(Round(dat/2.56565656));
   if (Round(dat/2.56565656) < StrToInt(FCliente.ETemperatura.Text)) then
      FCliente.EOnOfT.Color:= $00FF8000
   else
      FCliente.EOnOft.Color:= $000E1AF1;
end;

procedure Hilo.paintLuzH();
var
   i: integer;
begin
   FCliente.Series2.Clear;
   for i:= Length(senalL)-1 downto 1 do
      senalL[i]:= senalL[i-1];
   senalL[0]:= dat;
   FCliente.Series2.AddArray(senalL);
   FCliente.EInstantaneoL.Text:= IntToStr(dat);
   if (dat < StrToInt(FCliente.ELuz.Text)) then
      FCliente.EOnOfL.Color:= $00FF8000
   else
      FCliente.EOnOfL.Color:= $000E1AF1;
end;

procedure Hilo.imprimirDatos();
begin
   FCliente.MMensajes.Lines.Add(IntToStr(dat));
end;


end.

    Source: geocities.com/tiger928rs/txt

               ( geocities.com/tiger928rs)